/**
 * An adapter for Shadowbox and the MooTools JavaScript framework.
 *
 * This file is part of Shadowbox.
 *
 * Shadowbox is an online media viewer application that supports all of the
 * web's most popular media publishing formats. Shadowbox is written entirely
 * in JavaScript and CSS and is highly customizable. Using Shadowbox, website
 * authors can showcase a wide assortment of media in all major browsers without
 * navigating users away from the linking page.
 *
 * You should have received a license with this distribution explaining the terms
 * under which Shadowbox may be used. If you did not, you may obtain a copy of the
 * license at http://shadowbox-js.com/LICENSE
 *
 * @author      Michael J. I. Jackson <michael@mjijackson.com>
 * @copyright   2007-2009 Michael J. I. Jackson
 * @version     SVN: $Id: shadowbox-mootools.js 20M 2009-04-23 13:08:21Z (local) $
 */

// requires MooTools 1.2 Core
if(typeof MooTools == 'undefined')
    throw 'Unable to load Shadowbox adapter, MooTools not found';

if(typeof Shadowbox == 'undefined')
    throw 'Unable to load Shadowbox adapter, Shadowbox not found';

Shadowbox.lib = {

    /**
     * Gets the value of the style on the given element.
     *
     * @param   HTMLElement     el          The DOM element
     * @param   String          style       The script name of the style
     *                                      (e.g. marginTop, not margin-top)
     * @return  mixed                       The value of the given style
     * @public
     */
    getStyle: function(el, style){
        return $(el).getStyle(style);
    },

    /**
     * Removes an element from the DOM.
     *
     * @param   HTMLElement     el          The element to remove
     * @return  void
     * @public
     */
    remove: function(el){
        el.parentNode.removeChild(el);
    },

    /**
     * Gets the target of the given event. The event object passed will be
     * the same object that is passed to listeners registered with
     * addEvent().
     *
     * @param   mixed           e           The event object
     * @return  HTMLElement                 The event's target element
     * @public
     */
    getTarget: function(e){
        return e.target;
    },

    /**
     * Gets the page X/Y coordinates of the mouse event in an [x, y] array.
     * The page coordinates should be relative to the document, and not the
     * viewport. The event object provided here will be the same object that
     * is passed to listeners registered with addEvent().
     *
     * @param   mixed           e           The event object
     * @return  Array                       The page X/Y coordinates
     * @public
     */
    getPageXY: function(e){
        return [e.page.x, e.page.y];
    },

    /**
     * Prevents the event's default behavior. The event object passed will
     * be the same object that is passed to listeners registered with
     * addEvent().
     *
     * @param   mixed           e           The event object
     * @return  void
     * @public
     */
    preventDefault: function(e){
        e.preventDefault();
    },

    /**
     * Gets the key code of the given event object (keydown). The event
     * object here will be the same object that is passed to listeners
     * registered with addEvent().
     *
     * @param   mixed           e           The event object
     * @return  Number                      The key code of the event
     * @public
     */
    keyCode: function(e){
        return e.code;
    },

    /**
     * Adds an event listener to the given element. It is expected that this
     * function will be passed the event as its first argument.
     *
     * @param   HTMLElement     el          The DOM element to listen to
     * @param   String          name        The name of the event to register
     *                                      (i.e. 'click', 'scroll', etc.)
     * @param   Function        handler     The event handler function
     * @return  void
     * @public
     */
    addEvent: function(el, name, handler){
        $(el).addEvent(name, handler);
    },

    /**
     * Removes an event listener from the given element.
     *
     * @param   HTMLElement     el          The DOM element to stop listening to
     * @param   String          name        The name of the event to stop
     *                                      listening for (i.e. 'click')
     * @param   Function        handler     The event handler function
     * @return  void
     * @public
     */
    removeEvent: function(el, name, handler){
        $(el).removeEvent(name, handler);
    },

    /**
     * Appends an HTML fragment to the given element.
     *
     * @param   HTMLElement     el          The element to append to
     * @param   String          html        The HTML fragment to use
     * @return  void
     * @public
     */
    append: function(el, html){
        if(el.insertAdjacentHTML){
            el.insertAdjacentHTML('BeforeEnd', html);
        }else if(el.lastChild){
            var range = el.ownerDocument.createRange();
            range.setStartAfter(el.lastChild);
            var frag = range.createContextualFragment(html);
            el.appendChild(frag);
        }else{
            el.innerHTML = html;
        }
    }

};

// add onDOMReady handler
window.addEvent('domready', Shadowbox.load);
